package data;

import java.io.File;
import java.util.TreeSet;

/**
 * 
 * @author Benjamin GOUIT et David SOLO RABRIMANANA
 *
 */
public class Data {

	User localUser;
	TreeSet<User> users;
	TreeSet<FileChat> filesWaiting;
	
	/**
	 * Constructeur
	 * @param localUsername
	 * @param localAddr
	 */
	public Data (String localUsername, String localAddr) {
		localUser = new User(localUsername, localAddr);
		users = new TreeSet<User> ();
		filesWaiting = new TreeSet<FileChat> ();
	}
	
	/**
	 * Getter du nom de l'utilisateur local
	 * @return
	 */
	public String getLocalName () {
		return localUser.getName();
	}
	
	/**
	 * Getter de l'adresse de l'utilisateur local
	 * @return
	 */
	public String getLocalAddr () {
		return localUser.getAddr();
	}
	
	/**
	 * Ajout d'un nouvel utilisateur
	 * @param username
	 * @param addr
	 * @return
	 */
	public boolean addNewUser (String username, String addr) {
		User u = new User (username, addr);
		boolean estNouveau = !(users.contains(u));
		users.add(u);
		if (estNouveau) System.out.println("New user in dataBase :\n"+users);
		else System.out.println("User already in dataBase : "+username+"@"+addr);
		return estNouveau;
	}
	
	/**
	 * Récupération de l'adresse d'un utilisateur à partir de son nom
	 * @param username
	 * @return
	 */
	public String getAddr (String username) {
		
		for (User u : users) {
			if ((u.getName()).equals(username))
				return u.getAddr();
		}
		return null;
	}
	
	/**
	 * Récpuration du nom de l'utilisateur à partir de son adresse
	 * @param addr
	 * @return
	 */
	public User getUser (String addr) {
		for (User u : users) {
			if ((u.getAddr()).equals(addr))
				return u;
		}
		return null;
	}
	
	/**
	 * Suppression d'un utilisateur
	 * @param addr
	 * @return
	 */
	public String removeUser (String addr) {
		
		String s = null;
		User toRemove = null;
		
		for (User u : users) {
			if ((u.getAddr()).equals(addr)) {
				s = new String(u.toString());
				toRemove = u;
			}
		}
		if (s != null)
			users.remove(toRemove);
		
		return s;
	}
	
	/**
	 * Ajout d'un fichier a envoyer
	 * @param file
	 * @param id
	 * @param addr
	 */
	public void addFileToSend (File file, int id, String addr) {
		filesWaiting.add(new FileChat(file, id, addr));
	}
	
	
	/**
	 * Récupération du fichier a envoyer à addr à partir de l'id
	 * @param id
	 * @param addr
	 * @return
	 */
	public File getFileToSend (int id, String addr) {
		for (FileChat f : filesWaiting) {
			if (f.getID() == id) {
				if (f.getAddr().equals(addr))
					return f.getFile();
				else {
					System.out.println("The user at @"+addr+" is not for the file number "+id);
					return null;
				}
			}
		}
		System.out.println("Error:There is no file number "+id+"in the file data base.");
		return null;
	}
	
	/**
	 * Suppression d'un fichier à envoyer
	 * @param id
	 * @param addr
	 */
	public void removeFileToSend (int id, String addr) {
		FileChat toRemove = null;
		
		for (FileChat f : filesWaiting) {
			if (f.getID() == id) {
				if (f.getAddr().equals(addr))
					toRemove = f;
				else {
					System.out.println("The user at @"+addr+" is not for the file number "+id);
				}
			}
		}
		if (toRemove != null)
			filesWaiting.remove(toRemove);
		else
			System.out.println("Error:There is no file number "+id+"in the file data base.");
	}
}
